﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using ProgNetComponentsDx.Browsers;
using ProgNetComponents.Classes;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraScheduler.UI;
using ProgNetComponentsDx.Options;
using DevExpress.XtraGrid.Views.Grid;

namespace Wydatki.Zakupy
{
    public partial class FormZakupyStatystyki : XtraForm
    {
        List<GridView> grids = new List<GridView>();
        Dictionary<GridView, Dictionary<string, string>> layouts = new Dictionary<GridView, Dictionary<string, string>>();
        GridColumn[] ColumnsRok = null;
        GridColumn[] ColumnsMiesiac = null;
        GridColumn[] ColumnsTydzien = null;

        public FormZakupyStatystyki()
        {
            InitializeComponent();
            grids.Add(gvProdukty);
            grids.Add(gvKategorie);
            grids.Add(gvSklepy);
            grids.Add(gvCzasowe);
            grids.Add(gvProdKat);
            
            DateTime ds = DateTime.Now;
            DateTime de = DateTime.Now;
            string defLoadTime = OptionCache.GetOptionStringValue(Init.InitFormOptionNames.Work_Group.StatystykiWydatkow.DefOpenTime);
            
            switch (defLoadTime)
            {
                case WydatkiGlobals.WydatkiDefOpenType.Miesiac:
                    ds = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
                    de = ds.AddMonths(1).AddDays(-1).DayEnd();
                    break;
                case WydatkiGlobals.WydatkiDefOpenType.Ostatnie30Dni:
                    ds = DateTime.Now.DayStart().AddDays(-30);
                    de = DateTime.Now.DayStart();
                    break;
                case WydatkiGlobals.WydatkiDefOpenType.Tydzien:
                    ds = DateTime.Now.DayStart().AddDays(-7);
                    de = DateTime.Now.DayStart();
                    break;
                case WydatkiGlobals.WydatkiDefOpenType.Nic:
                    ds = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
                    de = ds.AddMonths(1).AddDays(-1).DayEnd();
                    ceWszystkie.Checked = true;
                    break;
            }

            editDo.EditValue = de;
            editOd.EditValue = ds;
            
           
            ceWszystkie_CheckedChanged(ceWszystkie, EventArgs.Empty);
            RepositoryItemMonth month = new RepositoryItemMonth();
            colMIESIAC.ColumnEdit = month;
            colMIESIAC1.ColumnEdit = month;
            colMIESIAC2.ColumnEdit = month;
            colMiesiacProdKat.ColumnEdit = month;
        }
        protected override void OnLoad(EventArgs e)
        {
            ColumnsRok = new GridColumn[]{
                colROK,colROK1,colROK2, colRokProdKat
            };
            ColumnsMiesiac = new GridColumn[]{
                colMIESIAC,colMIESIAC1,colMIESIAC2,colMiesiacProdKat
            };
            ColumnsTydzien = new GridColumn[]{
                colTYDZIEN,colTYDZIEN1,colTYDZIEN2,colTydzienProdKat
            };
            layoutProvider1.SaveCurrentLayoutAsDefault();
            foreach (GridView gv in grids)
            {
                gv.GridControl.ForceInitialize();
            }
            GetDefaultLayouts();

            rgTyp.EditValue = OptionCache.GetOptionStringValue(Init.InitFormOptionNames.Work_Group.StatystykiWydatkow.DomyslnyTyp);
            rgTyp_SelectedIndexChanged(rgTyp, EventArgs.Empty);
            base.OnLoad(e);
        }
        private void InitDataSource()
        {
            SetDs(ceListProdukty, Init.InitFormBrowserNames.Glowna.Produkty);
            SetDs(ceListSumaKategorii, Init.InitFormBrowserNames.Glowna.KategorieProduktow);
            SetDs(ceListSklepyProdukty, Init.InitFormBrowserNames.Glowna.Produkty);
            SetDs(ceListSklepy, Init.InitFormBrowserNames.Glowna.Sklepy);
            SetDs(listProdKat, Init.InitFormBrowserNames.Glowna.KategorieProduktow);
        }
        
        private void SetDs(CheckedListBoxControl ctrl, object browserId)
        {
            Browser b = browserProvider1.GetBrowser(browserId);
            if (b != null)
            {
                ctrl.DataSource = new DataView(b.GetTable());
                ctrl.DisplayMember = b.DisplayMember;
                ctrl.ValueMember = b.ValueMember;
                ZaznaczOdznacz(ctrl, true);
            }
        }
        private void ceWszystkie_CheckedChanged(object sender, EventArgs e)
        {
            if (ceWszystkie.Checked)
            {
                modeProvider1.GetSettings(editOd).ReadOnlyModes = ProgNetComponentsDx.Enums.FormMode.All;
                modeProvider1.GetSettings(editDo).ReadOnlyModes = ProgNetComponentsDx.Enums.FormMode.All;

                modeProvider1.GetSettings(editOd).RequiredModes = ProgNetComponentsDx.Enums.FormMode.None;
                modeProvider1.GetSettings(editDo).RequiredModes = ProgNetComponentsDx.Enums.FormMode.None;
            }
            else
            {
                modeProvider1.GetSettings(editOd).ReadOnlyModes = ProgNetComponentsDx.Enums.FormMode.None;
                modeProvider1.GetSettings(editDo).ReadOnlyModes = ProgNetComponentsDx.Enums.FormMode.None;

                modeProvider1.GetSettings(editOd).RequiredModes = ProgNetComponentsDx.Enums.FormMode.All;
                modeProvider1.GetSettings(editDo).RequiredModes = ProgNetComponentsDx.Enums.FormMode.All;
            }
            dxErrorProvider1.ClearErrors();
        }
        private void ZaznaczOdznacz(CheckedListBoxControl ctrl, bool zaznacz)
        {
            int count = 0;
            try
            {
                count = (ctrl.DataSource as DataView).Table.Rows.Count;
            }
            catch { }
            for (int i=0; i < count; i++)
                ctrl.SetItemChecked(i, zaznacz);
        }
        private void FormZakupyStatystyki_Load(object sender, EventArgs e)
        {
            if (!this.IsDesignMode())
                InitDataSource();
        }
        private void rgTyp_SelectedIndexChanged(object sender, EventArgs e)
        {
            layoutProvider1.SaveLayout();
            string str = rgTyp.EditValue.AsString();
            
            foreach (GridView gv in grids)
            {
                gv.SetLayoutXml(layouts[gv][str]);
                layoutProvider1.GetSettings(gv).DefaultLayout = layouts[gv][str];
                layoutProvider1.GetSettings(gv).ControlName = gv.Name + "_" + str;
            }
            layoutProvider1.ApplySavedLayout();

            this.zakupyStatystykiDataSet1.Clear();

            bool isCzasowe = str == "M" || str == "T";
            bool isTydzien = str == "T";

            tabCzasowe.PageVisible = isCzasowe;

            foreach (GridColumn c in ColumnsRok)
                c.OptionsColumn.ShowInCustomizationForm = isCzasowe;
            
            foreach (GridColumn c in ColumnsMiesiac)
                c.OptionsColumn.ShowInCustomizationForm = isCzasowe;

            foreach (GridColumn c in ColumnsTydzien)
                c.OptionsColumn.ShowInCustomizationForm = isTydzien;
        }
        private void GetDefaultLayouts()
        {
            foreach (GridView gv in grids)
            {
                gv.OptionsView.ShowGroupPanel = true;
            }

            string[] strings = new string[] { "O", "M", "T" };
            foreach (string s in strings)
            {
                foreach (GridColumn c in ColumnsRok)
                    c.Visible = false;
                foreach (GridColumn c in ColumnsMiesiac)
                    c.Visible = false;
                foreach (GridColumn c in ColumnsTydzien)
                    c.Visible = false;

                bool isCzasowe = s == "M" || s == "T";
                bool isTydzien = s == "T";

                foreach (GridColumn c in ColumnsRok)
                {
                    c.VisibleIndex = (isCzasowe ? 0 : -1);
                    if(isCzasowe)
                        c.Group();
                }

                foreach (GridColumn c in ColumnsMiesiac)
                {
                    c.VisibleIndex = (isCzasowe ? 1 : -1);
                    if (isCzasowe)
                        c.Group();
                }

                foreach (GridColumn c in ColumnsTydzien)
                {
                    c.VisibleIndex = (isTydzien ? 2 : -1);
                    if (isTydzien)
                        c.Group();
                }
                
                foreach (GridView gv in grids)
                {
                    Dictionary<string, string> l = null;
                    if (layouts.ContainsKey(gv))
                    {
                        l = layouts[gv];
                    }
                    else
                    {
                        l = new Dictionary<string, string>();
                        layouts.Add(gv, l);
                    }
                    l.Add(s, gv.GetLayoutXml());
                }
            }
        }

        #region Wydatki na produkty
        private void btnProduktyZaznaczWszystkie_Click(object sender, EventArgs e)
        {
            ZaznaczOdznacz(ceListProdukty, true);
        }

        private void btnProduktyOdznaczWszystkie_Click(object sender, EventArgs e)
        {
            ZaznaczOdznacz(ceListProdukty, false);
        }

        private void btnProduktyPokaz_Click(object sender, EventArgs e)
        {
            string msg = "";
            dxErrorProvider1.ClearErrors();
            if (!modeProvider1.ValidateRequiredEdits(ref msg))
                return;
            if (ceListProdukty.CheckedItems.Count == 0)
                return;

            string select = "SELECT WRK_WYD_PROD_PRODUKT AS PRODUKT, " +
                " sum(ROUND(WRK_WYD_PROD_CENA_JEDNOSTKOWA * WRK_WYD_PROD_ILOSC, 2)) AS KOSZT" +
                GetKolumnyForTyp(false) +
                " FROM WRK_WYDATKI_PRODUKTY P,WRK_WYDATKI W " +
                " WHERE W.WRK_WYD_ID = P.WRK_WYD_PROD_WYDATEK";

            List<NamedObject> parameters = new List<NamedObject>();
            if (ceListProdukty.CheckedItems.Count != (ceListProdukty.DataSource as DataView).Table.Rows.Count)
            {
                string str = "";
                foreach (DataRowView o in ceListProdukty.CheckedItems)
                {
                    str = str.AppendString(",");
                    str += o.Row["STP_PROD_ID"].AsString();
                }
                select += " AND WRK_WYD_PROD_PRODUKT IN (" + str + ") ";
            }
            if (!ceWszystkie.Checked)
            {
                select += " AND W.WRK_WYD_DATA >=@DATA_OD AND W.WRK_WYD_DATA <= @DATA_DO ";
                parameters.Add(new NamedObject("DATA_OD", editOd.DateTime.DayStart()));
                parameters.Add(new NamedObject("DATA_DO", editDo.DateTime.DayEnd()));
            }
            select += " GROUP BY WRK_WYD_PROD_PRODUKT" +
                GetKolumnyForTyp(true);

            if (!sqlCeDataManager1.FillTable(zakupyStatystykiDataSet1.KosztyProduktow, select, parameters.ToArray()))
            {
                sqlCeDataManager1.LastException.Log();
                this.ShowDxErrorDialog("Błąd pobierania dancyh");
            }
        }
        #endregion
        #region suma kosztow kategorii
        private void btnPokazSumaKategorii_Click(object sender, EventArgs e)
        {
            string msg = "";
            dxErrorProvider1.ClearErrors();
            if (!modeProvider1.ValidateRequiredEdits(ref msg))
                return;
            if (ceListSumaKategorii.CheckedItems.Count == 0)
                return;
            string select = @"select STP_PRODK_KATEGORIA AS KATEGORIA, 
                sum(ROUND(WRK_WYD_PROD_CENA_JEDNOSTKOWA*WRK_WYD_PROD_ILOSC, 2)) as KOSZT"
                + GetKolumnyForTyp(false) +
                @" from WRK_WYDATKI W, WRK_WYDATKI_PRODUKTY P left join STP_PROD_KAT K
on K.STP_PRODK_PRODUKT = P.WRK_WYD_PROD_PRODUKT
WHERE WRK_WYD_ID = WRK_WYD_PROD_WYDATEK ";
            List<NamedObject> parameters = new List<NamedObject>();
            if (ceListSumaKategorii.CheckedItems.Count != (ceListSumaKategorii.DataSource as DataView).Table.Rows.Count)
            {
                string str = "";
                foreach (DataRowView o in ceListSumaKategorii.CheckedItems)
                {
                    str = str.AppendString(",");
                    str += o.Row["STP_KAT_PROD_ID"].AsString();
                }
                select += " AND STP_PRODK_KATEGORIA IN (" + str + ") ";
            }
            if (!ceWszystkie.Checked)
            {
                select += " AND W.WRK_WYD_DATA >=@DATA_OD AND W.WRK_WYD_DATA <= @DATA_DO ";
                parameters.Add(new NamedObject("DATA_OD", editOd.DateTime.DayStart()));
                parameters.Add(new NamedObject("DATA_DO", editDo.DateTime.DayEnd()));
            }
            select += " GROUP BY STP_PRODK_KATEGORIA" +
                GetKolumnyForTyp(true);
            if (!sqlCeDataManager1.FillTable(zakupyStatystykiDataSet1.KosztyKategorii, select, parameters.ToArray()))
            {
                sqlCeDataManager1.LastException.Log();
                this.ShowDxErrorDialog("Błąd pobierania dancyh");
            }
        }

        private void btnZaznaczSumaKategorii_Click(object sender, EventArgs e)
        {
            ZaznaczOdznacz(ceListSumaKategorii, true);
        }

        private void btnOdznaczSumaKategorii_Click(object sender, EventArgs e)
        {
            ZaznaczOdznacz(ceListSumaKategorii, false);
        }
        #endregion
        #region Ceny w sklepach
        private void btnZaznaczSklepyProdukty_Click(object sender, EventArgs e)
        {
            ZaznaczOdznacz(ceListSklepyProdukty, true);
        }

        private void btnOdznaczSklepyProdukty_Click(object sender, EventArgs e)
        {
            ZaznaczOdznacz(ceListSklepyProdukty, false);
        }

        private void btnZaznaczSklepy_Click(object sender, EventArgs e)
        {
            ZaznaczOdznacz(ceListSklepy, true);
        }

        private void btnOdznaczSklepy_Click(object sender, EventArgs e)
        {
            ZaznaczOdznacz(ceListSklepy, false);
        }

        private void btnPokazSklepy_Click(object sender, EventArgs e)
        {
            string msg = "";
            dxErrorProvider1.ClearErrors();
            if (!modeProvider1.ValidateRequiredEdits(ref msg))
                return;
            if (ceListSklepyProdukty.CheckedItems.Count == 0 || ceListSklepy.CheckedItems.Count == 0)
                return;

            string select = @"select count(*) AS ILOSC, WRK_WYD_SKLEP, WRK_WYD_PROD_PRODUKT, WRK_WYD_PROD_CENA_JEDNOSTKOWA 
from WRK_WYDATKI W, WRK_WYDATKI_PRODUKTY P
where WRK_WYD_PROD_WYDATEK = WRK_WYD_ID";
            List<NamedObject> parameters = new List<NamedObject>();
            if (ceListSklepy.CheckedItems.Count != (ceListSklepy.DataSource as DataView).Table.Rows.Count)
            {
                string str = "";
                foreach (DataRowView o in ceListSklepy.CheckedItems)
                {
                    str = str.AppendString(",");
                    str += o.Row["STP_SKL_ID"].AsString();
                }
                select += " AND WRK_WYD_SKLEP IN (" + str + ") ";
            }
            if (ceListSklepyProdukty.CheckedItems.Count != (ceListSklepyProdukty.DataSource as DataView).Table.Rows.Count)
            {
                string str = "";
                foreach (DataRowView o in ceListSklepyProdukty.CheckedItems)
                {
                    str = str.AppendString(",");
                    str += o.Row["STP_PROD_ID"].AsString();
                }
                select += " AND WRK_WYD_PROD_PRODUKT IN (" + str + ") ";
            }
            if (!ceWszystkie.Checked)
            {
                select += " AND W.WRK_WYD_DATA >=@DATA_OD AND W.WRK_WYD_DATA <= @DATA_DO ";
                parameters.Add(new NamedObject("DATA_OD", editOd.DateTime.DayStart()));
                parameters.Add(new NamedObject("DATA_DO", editDo.DateTime.DayEnd()));
            }
            select += " group by WRK_WYD_SKLEP, WRK_WYD_PROD_PRODUKT, WRK_WYD_PROD_CENA_JEDNOSTKOWA";

            if (!sqlCeDataManager1.FillTable(zakupyStatystykiDataSet1.CenyProduktowWSklepach, select, parameters.ToArray()))
            {
                sqlCeDataManager1.LastException.Log();
                this.ShowDxErrorDialog("Błąd pobierania dancyh");
            }
        }
        #endregion
        #region Czasowe

        private string GetKolumnyForTyp(bool forGroup)
        {
            string s = "";
            string str = rgTyp.EditValue.AsString();
            if (str == "M" || str == "T")
                s = ",DATEPART(year, WRK_WYD_DATA) " + (forGroup ? "" : " AS ROK") +
                    ",DATEPART(month, WRK_WYD_DATA)" + (forGroup ? "" : " AS MIESIAC");
            if (str == "T")
                s += ",(DATEPART(day, WRK_WYD_DATA)/7+1)" + (forGroup ? "" : " AS TYDZIEN");
            return s;
        }

        private void btnPokazCzasowe_Click(object sender, EventArgs e)
        {
            string msg = "";
            dxErrorProvider1.ClearErrors();
            if (!modeProvider1.ValidateRequiredEdits(ref msg))
                return;
           
            string select = "SELECT " +
                " sum(ROUND(WRK_WYD_PROD_CENA_JEDNOSTKOWA * WRK_WYD_PROD_ILOSC, 2)) AS KOSZT" +
                GetKolumnyForTyp(false) +
                " FROM WRK_WYDATKI_PRODUKTY P,WRK_WYDATKI W " +
                " WHERE W.WRK_WYD_ID = P.WRK_WYD_PROD_WYDATEK";
            List<NamedObject> parameters = new List<NamedObject>();
            if (!ceWszystkie.Checked)
            {
                select += " AND W.WRK_WYD_DATA >=@DATA_OD AND W.WRK_WYD_DATA <= @DATA_DO ";
                parameters.Add(new NamedObject("DATA_OD", editOd.DateTime.DayStart()));
                parameters.Add(new NamedObject("DATA_DO", editDo.DateTime.DayEnd()));
            }
            select += " GROUP BY " +
                GetKolumnyForTyp(true).TrimStart(',');

            if (!sqlCeDataManager1.FillTable(zakupyStatystykiDataSet1.KosztyCzasowe, select, parameters.ToArray()))
            {
                sqlCeDataManager1.LastException.Log();
                this.ShowDxErrorDialog("Błąd pobierania dancyh");
            }
        }
        #endregion
        #region ProdKat
        private void btnPokazProdKat_Click(object sender, EventArgs e)
        {
            string msg = "";
            dxErrorProvider1.ClearErrors();
            if (!modeProvider1.ValidateRequiredEdits(ref msg))
                return;
            if (listProdKat.CheckedItems.Count == 0)
                return;
            string select = @"select WRK_WYD_PROD_PRODUKT as PRODUKT, STP_PRODK_KATEGORIA AS KATEGORIA, 
                sum(ROUND(WRK_WYD_PROD_CENA_JEDNOSTKOWA*WRK_WYD_PROD_ILOSC, 2)) as KOSZT"
                + GetKolumnyForTyp(false) +
                @" from WRK_WYDATKI W, WRK_WYDATKI_PRODUKTY P left join STP_PROD_KAT K
on K.STP_PRODK_PRODUKT = P.WRK_WYD_PROD_PRODUKT
WHERE WRK_WYD_ID = WRK_WYD_PROD_WYDATEK ";
            List<NamedObject> parameters = new List<NamedObject>();
            if (listProdKat.CheckedItems.Count != (listProdKat.DataSource as DataView).Table.Rows.Count)
            {
                string str = "";
                foreach (DataRowView o in listProdKat.CheckedItems)
                {
                    str = str.AppendString(",");
                    str += o.Row["STP_KAT_PROD_ID"].AsString();
                }
                select += " AND STP_PRODK_KATEGORIA IN (" + str + ") ";
            }
            if (!ceWszystkie.Checked)
            {
                select += " AND W.WRK_WYD_DATA >=@DATA_OD AND W.WRK_WYD_DATA <= @DATA_DO ";
                parameters.Add(new NamedObject("DATA_OD", editOd.DateTime.DayStart()));
                parameters.Add(new NamedObject("DATA_DO", editDo.DateTime.DayEnd()));
            }
            select += " GROUP BY STP_PRODK_KATEGORIA, WRK_WYD_PROD_PRODUKT" +
                GetKolumnyForTyp(true);
            if (!sqlCeDataManager1.FillTable(zakupyStatystykiDataSet1.KosztyProdKat, select, parameters.ToArray()))
            {
                sqlCeDataManager1.LastException.Log();
                this.ShowDxErrorDialog("Błąd pobierania dancyh");
            }
        }

        private void btnZaznaczProdKat_Click(object sender, EventArgs e)
        {
            ZaznaczOdznacz(listProdKat, true);
        }

        private void btnOdznaczProdKat_Click(object sender, EventArgs e)
        {
            ZaznaczOdznacz(listProdKat, false);
        }
        #endregion
    }
}
